/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package td3.Modele;

import java.util.Observable;

/** La classe Jeu possède un plateau et 2 joueurs
 * 
 * @author fredericdasilva
 */
public abstract class Jeu extends Observable implements Runnable{
    public Plateau P;
    public Joueur J1;
    public Joueur J2;
//    private volatile Thread currentThread = null;
    
    /** Le constructeur de Jeu
     *
     * @param a Le premier Joueur
     * @param b Le second Joueur
     */
    public Jeu(Joueur a, Joueur b){
        
        
        J1= a;
        J2= b;
        
    }
    
    /** Teste si le jeu en cours est terminé.
     *
     * @return Faux si le jeu n'est pas terminé, Vrai sinon.
     */
    public abstract boolean partieTerminee();
    
    /** Teste si le coup donné en paramètre à jouer est possible
     *
     * @param coup
     * @return Vrai si le coup est possible, faux sinon.
     */
    public abstract boolean coupPossible(Coup coup);
    
    /** Permet de jouer le jeu sur le plateau entre les 2 joueurs
     * 
     */
    public abstract void jouerPartie();
    
    /** Permet d'afficher à l'écran le gagnant
     *  Par exemple: "Le Joueur FRED Id 10 a gagné"
     */
    public abstract void quiAGagne();
    
    /** Teste si un joueur à gagné la partie
     *
     * @return Vrai si la partie est gagnée, faux sinon.
     */
    public abstract boolean AGagne();
    
    /** Donne le nom du gagnant de la partie
     * 
     * @return Le nom du gagnant
     */
    public abstract String quiStringAGagne();
    
    /** Renvoie le joueur dont c'est le tour de joueur 
     *
     * @return le Joueur suivant
     */
    public abstract Joueur joueurSuivant();
    
    /** Renvoie le nom du joueur dont c'est le tour de joueur 
     *
     * @return Le nom du joueur suivant
     */
    public abstract String nomJoueurSuivant();
    
    /** Renvoie le joueur dont c'est l'ID
     *
     * @param id un entier
     * @return un joueur <---> ID
     */
    public abstract Joueur quelleJoueur(int id);
    
    /** Permet de jouer un coup c par le joueur d'ID idJeu
     *
     * @param c   un Coup
     * @param idJeu  entier ID
     */
    public abstract void jouerCoupJeu(Coup c, int idJeu);
    
    /** Permet de jouer un coup c par le joueurHumain d'ID idJeu
     *
     * @param c   un Coup
     * @param idJeu  entier ID
     */
    public abstract void jouerCoupJeuJoueurHumain(Coup c, int idJeu);
    
    
    /** Permet de lancer le Jeu sous forme de Thread
     *
     */
    @Override
    public abstract void run();
    
    /** Permet d'arrêter le Thread qu'est le Jeu
     *
     */
    public abstract void arreter();
    public abstract void mise_en_attente();
    public abstract void reprise();
}



